package com.leonelviera.andronotes;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class UsuarioNotas extends ListActivity {
    private static final int ACTIVITY_CREATE=0;
    private static final int ACTIVITY_EDITAR=1;

    private NotasBdAdaptador mDbHelper;
	private int mUsuario_id;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notas_lista);
        mUsuario_id = getIntent().getExtras().getInt(NotasBdAdaptador.COL_USR_ID);
        mDbHelper = new NotasBdAdaptador(this);
        mDbHelper.open();
        sincronizarNotas();
        cargarLista();
        registerForContextMenu(getListView());
    }

    private void cargarLista() {
        
    	Cursor notesCursor = mDbHelper.getNotasUsuario(mUsuario_id);
        startManagingCursor(notesCursor);

        String[] desde = new String[]{NotasBdAdaptador.COL_TITULO};
        int[]    hasta = new int[]{R.id.textRow};

        SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notas_fila, notesCursor, desde, hasta);
        setListAdapter(notes);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.usuario_notas_om, menu);
        return true;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
            case R.id.om_insertar:
                crearNota();
                return true;
            case R.id.om_sincronizar:
            	sincronizarNotas();
            	return true; 	
        }

        return super.onMenuItemSelected(featureId, item);
    }

    private void sincronizarNotas() {
    	ProgressDialog progreso = ProgressDialog.show(this,"Sincronizando","Por favor espere mientras se sincornizan sus notas",true);
		AndroNotesWSCalls call = new AndroNotesWSCalls();
		String notas = call.notasPorUsuario(mUsuario_id);
		
		cargarNotasHaciaLaWeb();
		
		if (notas.length() > 0) {
			
			try {
				JSONArray notasJsonArray = new JSONObject(notas).getJSONArray("notas");
				cargarNotasDesdeLaWeb(notasJsonArray);
				actualizarDatosNotas(notasJsonArray);
				actualizarNotasBorradas(notasJsonArray);
			} catch (JSONException e) {
				System.out.println(e.getMessage());
			}
		} // if
		cargarLista();
		progreso.dismiss();
	}
    
    private void cargarNotasDesdeLaWeb(JSONArray notasJsonArray) throws JSONException{
    	for (int i = 0; i < notasJsonArray.length(); i++) {
			int nota_id = notasJsonArray.getJSONObject(i).getInt(NotasBdAdaptador.COL_NOTA_ID);
			
			if (mDbHelper.getNotaPorNotaId(nota_id).getCount() == 0) {
				String titulo      = notasJsonArray.getJSONObject(i).getString(NotasBdAdaptador.COL_TITULO);
				String descripcion = notasJsonArray.getJSONObject(i).getString(NotasBdAdaptador.COL_DESCRIP);
				int    modificado  = notasJsonArray.getJSONObject(i).getInt(NotasBdAdaptador.COL_FEC_MOD);
				
				mDbHelper.crearNota(titulo, descripcion, mUsuario_id, nota_id, modificado);
			}
		}
    }
   
    private void actualizarDatosNotas(JSONArray notasJsonArray) throws JSONException{
    	for (int i = 0; i < notasJsonArray.length(); i++) {
    		
			int    nota_id     = notasJsonArray.getJSONObject(i).getInt(NotasBdAdaptador.COL_NOTA_ID);
			String titulo      = notasJsonArray.getJSONObject(i).getString(NotasBdAdaptador.COL_TITULO);
			String descripcion = notasJsonArray.getJSONObject(i).getString(NotasBdAdaptador.COL_DESCRIP);
			int    modificado  = notasJsonArray.getJSONObject(i).getInt(NotasBdAdaptador.COL_FEC_MOD);
			
			Cursor notaCursor = mDbHelper.getNotaPorNotaId(nota_id);
			startManagingCursor(notaCursor);
			notaCursor.moveToFirst();
			
			if (notaCursor.getCount() == 1) {
				
				int local_modificado = notaCursor.getInt(notaCursor.getColumnIndex(NotasBdAdaptador.COL_FEC_MOD));
				
				if (local_modificado != modificado) {
				
					if (local_modificado < modificado)
						mDbHelper.modificarNota(nota_id, titulo, descripcion, modificado);
					else {
						String local_titulo 	 = notaCursor.getString(notaCursor.getColumnIndex(NotasBdAdaptador.COL_TITULO));
						String local_descripcion = notaCursor.getString(notaCursor.getColumnIndex(NotasBdAdaptador.COL_DESCRIP));
						
						AndroNotesWSCalls call = new AndroNotesWSCalls();
						call.modificarNota(nota_id, local_titulo, local_descripcion, local_modificado);
					}
				}
			}
		}
    }
    
    private void cargarNotasHaciaLaWeb() {
    	Cursor notasCursor = mDbHelper.getNotasUsuario(mUsuario_id,0);
    	startManagingCursor(notasCursor);
    	
    	if (notasCursor.getCount() > 0) {
    		AndroNotesWSCalls call = new AndroNotesWSCalls();
    		for (int i = 0; i < notasCursor.getCount(); i++) {
				notasCursor.moveToPosition(i);
				int id		       = notasCursor.getInt(notasCursor.getColumnIndex(NotasBdAdaptador.COL_ID));
				String titulo      = notasCursor.getString(notasCursor.getColumnIndex(NotasBdAdaptador.COL_TITULO));
				String descripcion = notasCursor.getString(notasCursor.getColumnIndex(NotasBdAdaptador.COL_DESCRIP));
				int modificado     = notasCursor.getInt(notasCursor.getColumnIndex(NotasBdAdaptador.COL_FEC_MOD));
				
				int nota_id = call.guardarNota(mUsuario_id, titulo, descripcion, modificado);
				if (nota_id != 0)
		        	mDbHelper.setNotaId(id, nota_id);
			}
    	}
    }
    
    
	private void actualizarNotasBorradas(JSONArray notasJsonArray) throws JSONException {
    	Cursor notasCursor = mDbHelper.getNotasUsuario(mUsuario_id);
    	startManagingCursor(notasCursor);
    	
    	if (notasCursor.getCount() > 0) {
    		boolean encontrado;
    		int j;
    		ArrayList<Integer> notasParaBorrar = new ArrayList<Integer>();
    		
    		for (int i = 0; i < notasCursor.getCount(); i++) {
				notasCursor.moveToPosition(i);
				encontrado = false;
				j = 0;
				
				int id		= notasCursor.getInt(notasCursor.getColumnIndex(NotasBdAdaptador.COL_ID));
				int nota_id = notasCursor.getInt(notasCursor.getColumnIndex(NotasBdAdaptador.COL_NOTA_ID));
				
				while ((j < notasJsonArray.length()) && !(encontrado)) {
					if (notasJsonArray.getJSONObject(j).getInt(NotasBdAdaptador.COL_NOTA_ID) == nota_id)
						encontrado = true;
					j++;
				}
				
				if ( ! encontrado)
					notasParaBorrar.add(id);
			}
    		
    		for(int i = 0; i < notasParaBorrar.size(); i++) {
    			mDbHelper.borrarNota(notasParaBorrar.get(i),false);
    		}
    	}
    }
    
	@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.usuario_notas_cm, menu);

    }
	
	
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

        switch(item.getItemId()) {
            case R.id.cd_borrar:
                mDbHelper.borrarNota(info.id,true);
                cargarLista();
                return true;
            case R.id.cm_editar:
            	Intent i = new Intent(this, NotaEditor.class);
                i.putExtra(NotasBdAdaptador.COL_ID, info.id);
                startActivityForResult(i, ACTIVITY_EDITAR);
            	
        }
        return super.onContextItemSelected(item);
    }

    private void crearNota() {
        Intent i = new Intent(this, NotaEditor.class);
        i.putExtra(NotasBdAdaptador.COL_USR_ID, mUsuario_id);
        startActivityForResult(i, ACTIVITY_CREATE);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, NotaEditor.class);
        i.putExtra(NotasBdAdaptador.COL_ID, id);
        startActivityForResult(i, ACTIVITY_EDITAR);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        cargarLista();
    }
    
    @Override
    public void finish() {
    	super.finish();
    	mDbHelper.close();
    }
}
